#include <stdio.h>

char curr;
char YF[300];
int N = -1;


void eat() {
    N++;
}


void T();

void E();

void F();

void e();

void t();

void error();

void scaner();

void printLang();

char token_if = 'i';
char token_id = 'i';
char token_equal = '=';
char token_print = 'p';
char token_semicolon = ';';
char token_num = '1';
char token_left_par = '(';
char token_right_par = ')';
char token_comma = ',';
//is_al
//c++ isalpha
#include <iostream>
#include <cctype>

void Binop() {
    if (curr == '+' || curr == '-' || curr == '*' || curr == '/') {
        scaner();
    }
}

void Stm();

//是不是应该在遇到 + 的时候考虑后面的东西？...
//void scaner() ;
void Exp() {
//    int result = isalpha('27');
//    if(curr==token_id){
    printf("Exp\n");
    printLang();
//    如何优先来一个 exp
//这里遇到不懂的了，不知道怎么让exp 优先啊，前面不是 ;
    if (token_semicolon == curr) {
//        分号
//尽量让他是 二元的  但是也不能说明就是了
//前面是分号 并不能说明后面 就是二元
        scaner();
        Exp();
        Binop();
        Exp();
    } else if (isalpha(curr)) {
//        id  id 需要读取一个= 他自己本身要读取吗
        scaner();
//现在是要读取本身 他后面的也要读取吗
//话说因为设定的不好 是alpha的话 也可能是p ，p我的设定是print 。。
//        简单化 一个alpha的字母
        printLang();
        scaner();
    } else if (curr == token_num) {
//        数字只有1
        printLang();
        printf("number\n");
        scaner();
    } else if (curr == token_semicolon) {
        Exp();
        Binop();
        Exp();
    } else if (curr == token_left_par) {
        scaner();
        Stm();
        scaner();
        Exp();
    } else {
        error();
    }
}

//void Bi
void ExpList() {
    if (curr == token_semicolon) {
//        新的一句

        scaner();
        Exp();
        if (curr == token_comma) {
            scaner();
            ExpList();
        }


    }
}

void Stm() {
    printf("Stm\n");
    printLang();
//    if (curr == token_id) {
    if (isalpha(curr)) {
//        eat();
//        eat();
        scaner();
        scaner();
        Exp();
    } else if (curr == token_print) {
//        eat();
//        eat();
        scaner();
        scaner();
        ExpList();
    }
//    英语中分号（Semicolon）
    else if (curr == token_semicolon) {
//        新的一句

//优先级
        scaner();
        Stm();
        scaner();
        Stm();
    } else {
        error();
    }
}

int endIdx = 0;

int main() {
    char ch;
//    int i = 0;
    endIdx = 0;
    printf("请输入需要分析的curr语法：(以#结束)\n");
    do {
        scanf("%c", &ch);
        YF[endIdx] = ch;
        endIdx++;
    } while (ch != '#');
    scaner();
//    E();
    Stm();
    if (curr == '#')
        printf("成功！\n");
    else {
        printf("文法有误！！\n");
        error();
    }
}

void scaner() {

    N++;
    if (YF[N] == ' ') {
        N++;
//        eat 就是++
    } else {
        curr = YF[N];
    }
}

void E() {
    T();
    e();
}

void T() {
    F();
    t();
}

void e() {
    if (curr == '+') {
        scaner();
        T();
        e();
    } else if (curr == '-') {
        scaner();
        T();
        e();
    } else if (YF[N + 1] == '#' || YF[N + 1] == '+' || YF[N + 1] == '/' || YF[N + 1] == '*' || YF[N + 1] == '-') {
        if (YF[N] != '(' && YF[N] != ')')
            error();
    }
}

void t() {
    if (curr == '*') {
        scaner();
        F();
        T();
    } else if (curr == '/') {
        scaner();
        F();
        T();
    } else if (YF[N + 1] == '#' || YF[N + 1] == '+' || YF[N + 1] == '/' || YF[N + 1] == '*' || YF[N + 1] == '-') {
        if (YF[N] != '(' && YF[N] != ')')
            error();
    }
}

//LIE ZHI HUA TI GONG TAI MA
// 劣质化提供泰马
// 劣质话题共泰马
// 雷志华 提供代码
void F() {
    if (curr == '(') {
        scaner();
        E();
        if (curr == ')') {
            scaner();
            // printf("111111");
        } else {
            error();
        }
    } else {
        while (1) {
            if (curr >= 'a' && curr <= 'z' || curr >= 'A' && curr <= 'Z' || curr >= '0' && curr <= '9') {
                scaner();
            } else {
                break;
            }
        }
    }
}

void printLang() {
    printf("=========\n");
    printf("语法\n");
//    for (int i = 0; i <N ; ++i) {
    for (int i = 0; i < endIdx; ++i) {
        if (i == N) {
//            printf("(%c)",YF[i]);
            printf("[%c]", YF[i]);
        } else {
            printf("%c", YF[i]);
        }

    }
    printf("\n");
}

//请输入需要分析的curr语法：(以#结束)
//JIU5#
//成功！
void error() {
    printf("下标：%d %c之后的文法有错！\n", N, curr);
//    printf("现在的单词 %c",curr);
    printf("现在的单词 %c\n", curr);
//    YF
    printf("语法\n");
//    for (int i = 0; i <N ; ++i) {
    for (int i = 0; i < endIdx; ++i) {
        if (i == N) {
//            printf("(%c)",YF[i]);
            printf("[%c]", YF[i]);
        } else {
            printf("%c", YF[i]);
        }

    }
    printf("\n");

}